home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir44 / dungn32.zip / TIMEFNC.FOR < prev    next >
Text File  |  1994-10-07  |  45KB  |  1,192 lines

  1. C Clock events, demons, actors for DUNGEON.
  2. C
  3. C COPYRIGHT 1980, 1990, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA.
  4. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  5. C WRITTEN BY R. M. SUPNIK
  6. C
  7. C 27-Sep-94     RMS     Fixed bugs in thief demon, fight demon, master actor,
  8. C                       robot actor, dead player, balloon, bell.
  9. C 30-Jan-94     RMS     Fixed bugs from MS DOS port.
  10. C 18-Jan-94     RMS     Fixed bug in dead player recovery.
  11. C 01-Jul-92     RMS     Removed extraneous function from CEVAPP.
  12. C 30-Jun-92     RMS     Changed file names to lower case.
  13. C
  14. C CLOCKD- Intermove clock events demon
  15. C
  16. C Declarations
  17. C
  18.       LOGICAL FUNCTION CLOCKD(X)
  19.       IMPLICIT INTEGER (A-Z)
  20.       INCLUDE 'dparam.for'
  21. C
  22.       CLOCKD=.FALSE.                            ! assume no action.
  23.       DO 100 I=1,CLNT
  24.         IF(.NOT.CFLAG(I) .OR.(CTICK(I).EQ.0)) GO TO 100
  25.         IF(CTICK(I).LT.0) GO TO 50              ! permanent entry?
  26.         CTICK(I)=CTICK(I)-1
  27.         IF(CTICK(I).NE.0) GO TO 100             ! timer expired?
  28. 50      CLOCKD=.TRUE.
  29.         CALL CEVAPP(CACTIO(I))                  ! do action.
  30. 100   CONTINUE
  31.       RETURN
  32. C
  33.       END
  34.  
  35. C CEVAPP- Clock event applicables
  36. C
  37. C Declarations
  38. C
  39.       SUBROUTINE CEVAPP(RI)
  40.       IMPLICIT INTEGER (A-Z)
  41.       INCLUDE 'dparam.for'
  42.       INTEGER CNDTCK(10),LMPTCK(12)
  43.       LOGICAL FINDXT,LIT,RMDESC,QOPEN,MOVETO
  44.       LOGICAL F,QLEDGE,QHERE,PROB,WASLIT
  45. C
  46. C Functions and data
  47. C
  48.       QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  49.       QLEDGE(R)=(R.EQ.LEDG2).OR.(R.EQ.LEDG3).OR.(R.EQ.LEDG4)
  50.       DATA CNDTCK/50,20,10,5,0,156,156,156,157,0/
  51.       DATA LMPTCK/50,30,20,10,4,0,154,154,154,154,155,0/
  52. C
  53.       IF(RI.EQ.0) RETURN                        ! ignore disabled.
  54.       WASLIT=LIT(HERE)
  55.       GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,
  56.      111000,12000,13000,14000,15000,16000,17000,18000,19000,
  57.      220000,21000,22000,23000,24000,25000,26000,27000,28000,
  58.      329000,30000),RI
  59.       CALL BUG(3,RI)
  60. C
  61. C Return here to test for change in light.
  62. C
  63. 50    IF(WASLIT.AND..NOT.LIT(HERE)) CALL RSPEAK(406)
  64.       RETURN
  65.  
  66. C CEVAPP, PAGE 2
  67. C
  68. C CEV1--        Cure clock.  Let player slowly recover.
  69. C
  70. 1000  ASTREN(PLAYER)=MIN0(0,ASTREN(PLAYER)+1)   ! recover.
  71.       IF(ASTREN(PLAYER).GE.0) RETURN            ! fully recovered?
  72.       CFLAG(CEVCUR)=.TRUE.
  73.       CTICK(CEVCUR)=30                          ! no, wait some more.
  74.       RETURN
  75. C
  76. C CEV2--        Maint-room with leak.  Raise the water level.
  77. C
  78. 2000  IF(HERE.EQ.MAINT) CALL RSPEAK(71+(RVMNT/2)) ! describe.
  79.       RVMNT=RVMNT+1                             ! raise water level.
  80.       IF(RVMNT.LE.16) RETURN                    ! if not full, exit.
  81.       CTICK(CEVMNT)=0                           ! full, disable clock.
  82.       RFLAG(MAINT)=RFLAG(MAINT).OR.RMUNG        ! mung room.
  83.       RDESC1(MAINT)=80                          ! say it is full of water.
  84.       IF(HERE.EQ.MAINT) CALL JIGSUP(81)         ! drown him if present.
  85.       RETURN
  86. C
  87. C CEV3--        Lantern.  Describe growing dimness.
  88. C
  89. 3000  CALL LITINT(LAMP,ORLAMP,CEVLNT,LMPTCK,12) ! do light interrupt.
  90.       GO TO 50                                  ! go see if now dark.
  91. C
  92. C CEV4--        Match.  Out it goes.
  93. C
  94. 4000  CALL RSPEAK(153)                          ! match is out.
  95.       OFLAG1(MATCH)=OFLAG1(MATCH).AND. .NOT.(ONBT+FLAMBT+LITEBT)
  96.       GO TO 50                                  ! go see if now dark.
  97. C
  98. C CEV5--        Candle.  Describe growing dimness.
  99. C
  100. 5000  CALL LITINT(CANDL,ORCAND,CEVCND,CNDTCK,10) ! do candle interrupt.
  101.       GO TO 50                                  ! go see if now dark.
  102.  
  103. C CEVAPP, PAGE 3
  104. C
  105. C CEV6--        Balloon.
  106. C
  107. 6000  CFLAG(CEVBAL)=.TRUE.
  108.       CTICK(CEVBAL)=3                           ! reschedule interrupt.
  109.       F=AVEHIC(WINNER).EQ.BALLO                 ! see if in balloon.
  110.       IF(BLOC.EQ.VLBOT) GO TO 6800              ! at bottom?
  111.       IF(QLEDGE(BLOC)) GO TO 6700               ! on ledge?
  112.       IF(QOPEN(RECEP).AND.(BINFF.NE.0))
  113.      1GO TO 6500                                ! inflated and recep open?
  114. C
  115. C Balloon is in midair and is deflated (or has receptacle closed).
  116. C Fall to next room.
  117. C
  118.       IF(BLOC.NE.VAIR1) GO TO 6300              ! in vair1?
  119.       BLOC=VLBOT                                ! yes, now at vlbot.
  120.       CALL NEWSTA(BALLO,0,BLOC,0,0)
  121.       IF(F) GO TO 6200                          ! in balloon?
  122.       IF(QLEDGE(HERE).OR.(HERE.EQ.VLBOT))
  123.      1CALL RSPEAK(530)                          ! if can see, describe.
  124.       RETURN
  125. C
  126. 6200  F=MOVETO(BLOC,WINNER)                     ! move him.
  127.       IF(BINFF.EQ.0) GO TO 6250                 ! in balloon.  inflated?
  128.       CALL RSPEAK(531)                          ! yes, landed.
  129.       F=RMDESC(0)                               ! describe.
  130.       RETURN
  131. C
  132. 6250  CALL NEWSTA(BALLO,532,0,0,0)              ! no, balloon & contents die.
  133.       CALL NEWSTA(DBALL,0,BLOC,0,0)             ! insert dead balloon.
  134.       IF(LASTIT.EQ.BALLO) LASTIT=DBALL          ! fix last it reference.
  135.       AVEHIC(WINNER)=0                          ! not in vehicle.
  136.       CFLAG(CEVBAL)=.FALSE.                     ! disable interrupts.
  137.       CFLAG(CEVBRN)=.FALSE.
  138.       RETURN
  139. C
  140. 6300  BLOC=BLOC-1                               ! not in vair1, descend.
  141.       CALL NEWSTA(BALLO,0,BLOC,0,0)
  142.       IF(F) GO TO 6400                          ! is he in balloon?
  143.       IF(QLEDGE(HERE).OR.(HERE.EQ.VLBOT))
  144.      1CALL RSPEAK(533)                          ! if can see, describe.
  145.       RETURN
  146. C
  147. 6400  F=MOVETO(BLOC,WINNER)                     ! in balloon, move him.
  148.       CALL RSPEAK(534)                          ! describe.
  149.       F=RMDESC(0)
  150.       RETURN
  151. C
  152. C Balloon is in midair and is inflated, up-up-and-away! 
  153. c
  154. 6500  IF(BLOC.NE.VAIR4) GO TO 6600              ! at vair4?
  155.       CFLAG(CEVBRN)=.FALSE.                     ! disable interrupts.
  156.       CFLAG(CEVBAL)=.FALSE.
  157.       BINFF=0
  158.       BLOC=VLBOT                                ! fall to bottom.
  159.       CALL NEWSTA(BALLO,0,0,0,0)                ! balloon & contents die.
  160.       CALL NEWSTA(DBALL,0,BLOC,0,0)             ! substitute dead balloon.
  161.       IF(LASTIT.EQ.BALLO) LASTIT=DBALL          ! fix last it reference.
  162.       IF(F) GO TO 6550                          ! was he in it?
  163.       IF(QLEDGE(HERE)) CALL RSPEAK(535)         ! if can see, describe.
  164.       IF(HERE.EQ.VLBOT) CALL RSPEAK(925)        ! if at bottom, describe
  165.       RETURN
  166. C
  167. 6550  CALL JIGSUP(536)                          ! in balloon at crash, die.
  168.       RETURN
  169. C
  170. 6600  BLOC=BLOC+1                               ! not at vair4, go up.
  171.       CALL NEWSTA(BALLO,0,BLOC,0,0)
  172.       IF(F) GO TO 6650                          ! in balloon?
  173.       IF(QLEDGE(HERE).OR.(HERE.EQ.VLBOT))
  174.      1CALL RSPEAK(537)                          ! if can see, describe.
  175.       RETURN
  176. C
  177. 6650  F=MOVETO(BLOC,WINNER)                     ! move player.
  178.       CALL RSPEAK(538)                          ! describe.
  179.       F=RMDESC(0)
  180.       RETURN
  181. C
  182. C On ledge, goes to midair room whether inflated or not.
  183. C
  184. 6700  BLOC=BLOC+(VAIR2-LEDG2)                   ! move to midair.
  185.       CALL NEWSTA(BALLO,0,BLOC,0,0)
  186.       IF(F) GO TO 6750                          ! in balloon?
  187.       IF(QLEDGE(HERE).OR.(HERE.EQ.VLBOT))
  188.      1CALL RSPEAK(539)                          ! if can see, describe.
  189.       CFLAG(CEVVLG)=.TRUE.                      ! stranded.
  190.       CTICK(CEVVLG)=10                          ! materialize gnome.
  191.       RETURN
  192. C
  193. 6750  F=MOVETO(BLOC,WINNER)                     ! move to new room.
  194.       CALL RSPEAK(540)                          ! describe.
  195.       F=RMDESC(0)
  196.       RETURN
  197. C
  198. C At bottom, go up if inflated, do nothing if deflated.
  199. C
  200. 6800  IF((BINFF.EQ.0).OR..NOT.QOPEN(RECEP)) RETURN
  201.       BLOC=VAIR1                                ! inflated and open,
  202.       CALL NEWSTA(BALLO,0,BLOC,0,0)             ! go up to vair1.
  203.       IF(F) GO TO 6850                          ! in balloon?
  204.       IF(QLEDGE(HERE).OR.(HERE.EQ.VLBOT))
  205.      1CALL RSPEAK(541)                          ! if can see, describe.
  206.       RETURN
  207. C
  208. 6850  F=MOVETO(BLOC,WINNER)                     ! move player.
  209.       CALL RSPEAK(542)
  210.       F=RMDESC(0)
  211.       RETURN
  212.  
  213. C CEVAPP, PAGE 4
  214. C
  215. C CEV7--        Balloon burnup.
  216. C
  217. 7000  DO 7100 I=1,OLNT                          ! find burning object
  218.         IF((RECEP.EQ.OCAN(I)).AND.((OFLAG1(I).AND.FLAMBT).NE.0))
  219.      1GO TO 7200                                ! in receptacle.
  220. 7100  CONTINUE
  221.       CALL BUG(4,0)
  222. C
  223. 7200  CALL NEWSTA(I,0,0,0,0)                    ! vanish object.
  224.       BINFF=0                                   ! uninflated.
  225.       IF(HERE.EQ.BLOC) CALL RSPSUB(292,ODESC2(I)) ! describe.
  226.       RETURN
  227. C
  228. C CEV8--        Fuse function.
  229. C
  230. 8000  IF(OCAN(FUSE).NE.BRICK) GO TO 8500        ! ignited brick?
  231.       BR=OROOM(BRICK)                           ! get brick room.
  232.       BC=OCAN(BRICK)                            ! get container.
  233.       IF((BR.EQ.0).AND.(BC.NE.0)) BR=OROOM(BC)
  234.       IF(BR.EQ.0) BR=HERE                       ! it's here...
  235.       CALL NEWSTA(FUSE,0,0,0,0)                 ! kill fuse.
  236.       CALL NEWSTA(BRICK,0,0,0,0)                ! kill brick.
  237.       IF(BR.NE.HERE) GO TO 8100                 ! brick elsewhere?
  238. C
  239.       RFLAG(HERE)=RFLAG(HERE).OR.RMUNG          ! blew self.
  240.       RDESC1(HERE)=114                          ! mung room.
  241.       CALL JIGSUP(150)                          ! dead.
  242.       RETURN
  243. C
  244. 8100  CALL RSPEAK(151)                          ! boom.
  245.       MUNGRM=BR                                 ! save room that blew.
  246.       CFLAG(CEVSAF)=.TRUE.
  247.       CTICK(CEVSAF)=5                           ! set safe interrupt.
  248.       IF(BR.NE.MSAFE) GO TO 8200                ! blew safe room?
  249.       IF(BC.NE.SSLOT) RETURN                    ! was brick in safe?
  250.       CALL NEWSTA(SSLOT,0,0,0,0)                ! kill slot.
  251.       OFLAG2(SAFE)=OFLAG2(SAFE).OR.OPENBT       ! open safe.
  252.       SAFEF=.TRUE.                              ! indicate safe blown.
  253.       RETURN
  254. C
  255. 8200  DO 8250 I=1,OLNT                          ! blew wrong room.
  256.         IF(QHERE(I,BR) .AND. ((OFLAG1(I).AND.TAKEBT).NE.0))
  257.      1CALL NEWSTA(I,0,0,0,0)                    ! vanish contents.
  258. 8250  CONTINUE
  259.       IF(BR.NE.LROOM) RETURN                    ! blew living room?
  260.       DO 8300 I=1,OLNT
  261.         IF(OCAN(I).EQ.TCASE) CALL NEWSTA(I,0,0,0,0) ! kill trophy case.
  262. 8300  CONTINUE
  263.       RETURN
  264. C
  265. 8500  IF(QHERE(FUSE,HERE).OR.(OADV(FUSE).EQ.WINNER))
  266.      1CALL RSPEAK(152)
  267.       CALL NEWSTA(FUSE,0,0,0,0)                 ! kill fuse.
  268.       RETURN
  269.  
  270. C CEVAPP, PAGE 5
  271. C
  272. C CEV9--        Ledge munge.
  273. C
  274. 9000  RFLAG(LEDG4)=RFLAG(LEDG4).OR.RMUNG        ! ledge collapses.
  275.       RDESC1(LEDG4)=109
  276.       IF(HERE.EQ.LEDG4) GO TO 9100              ! was he there?
  277.       CALL RSPEAK(110)                          ! no, narrow escape.
  278.       RETURN
  279. C
  280. 9100  IF(AVEHIC(WINNER).NE.0) GO TO 9200        ! in vehicle?
  281.       CALL JIGSUP(111)                          ! no, dead.
  282.       RETURN
  283. C
  284. 9200  IF(BTIEF.NE.0) GO TO 9300                 ! tied to ledge?
  285.       CALL RSPEAK(112)                          ! no, no place to land.
  286.       RETURN
  287. C
  288. 9300  BLOC=VLBOT                                ! yes, crash balloon.
  289.       CALL NEWSTA(BALLO,0,0,0,0)                ! balloon & contents die.
  290.       CALL NEWSTA(DBALL,0,BLOC,0,0)             ! insert dead balloon.
  291.       IF(LASTIT.EQ.BALLO) LASTIT=DBALL          ! fix last it reference.
  292.       ODESC1(BTIEF)=1073                        ! restore description.
  293.       BTIEF=0
  294.       BINFF=0
  295.       CFLAG(CEVBAL)=.FALSE.
  296.       CFLAG(CEVBRN)=.FALSE.
  297.       CALL JIGSUP(113)                          ! dead.
  298.       RETURN
  299. C
  300. C CEV10--       Safe munge.
  301. C
  302. 10000 RFLAG(MUNGRM)=RFLAG(MUNGRM).OR.RMUNG      ! mung target.
  303.       RDESC1(MUNGRM)=114
  304.       IF(HERE.EQ.MUNGRM) GO TO 10100            ! is he present?
  305.       CALL RSPEAK(115)                          ! let him know.
  306.       IF(MUNGRM.NE.MSAFE) RETURN
  307.       CFLAG(CEVLED)=.TRUE.
  308.       CTICK(CEVLED)=8                           ! start ledge clock.
  309.       RETURN
  310. C
  311. 10100 I=116                                     ! he's dead,
  312.       IF((RFLAG(HERE).AND.RHOUSE).NE.0) I=117   ! one way or another.
  313.       CALL JIGSUP(I)                            ! let him know.
  314.       RETURN
  315.  
  316. C CEVAPP, PAGE 6
  317. C
  318. C CEV11--       Volcano gnome entrance.
  319. C
  320. 11000 IF(QLEDGE(HERE)) GO TO 11100              ! is he on ledge?
  321.       CFLAG(CEVVLG)=.TRUE.
  322.       CTICK(CEVVLG)=1                           ! no, wait a while.
  323.       RETURN
  324. C
  325. 11100 CALL NEWSTA(GNOME,118,HERE,0,0)           ! yes, materialize gnome.
  326.       RETURN
  327. C
  328. C CEV12--       Volcano gnome exit.
  329. C
  330. 12000 IF(OROOM(GNOME).EQ.HERE) CALL RSPEAK(149) ! player here to hear?
  331.       CALL NEWSTA(GNOME,0,0,0,0)                ! disappear the gnome.
  332.       RETURN
  333. C
  334. C CEV13--       Bucket.
  335. C
  336. 13000 IF(OCAN(WATER).EQ.BUCKE)
  337.      1CALL NEWSTA(WATER,0,0,0,0)                ! water leaks out.
  338.       RETURN
  339. C
  340. C CEV14--       Sphere.  If expires, he's trapped.
  341. C
  342. 14000 RFLAG(CAGER)=RFLAG(CAGER).OR.RMUNG        ! mung room.
  343.       RDESC1(CAGER)=147
  344.       WINNER=PLAYER                             ! kill player, not robot.
  345.       CALL JIGSUP(148)                          ! mung player.
  346.       RETURN
  347. C
  348. C CEV15--       END GAME HERALD.
  349. C
  350. 15000 ENDGMF=.TRUE.                             ! we're in endgame.
  351.       CALL RSPEAK(119)                          ! inform of endgame.
  352.       RETURN
  353.  
  354. C CEVAPP, PAGE 7
  355. C
  356. C CEV16--       Forest murmurs.
  357. C
  358. 16000 CFLAG(CEVFOR)=(HERE.EQ.MTREE).OR.
  359.      1((HERE.GE.FORE1).AND.(HERE.LT.CLEAR))
  360.       IF(CFLAG(CEVFOR).AND.PROB(10,10)) CALL RSPEAK(635)
  361.       RETURN
  362. C
  363. C CEV17--       Scol alarm.
  364. C
  365. 17000 IF(HERE.EQ.BKVAU) CALL JIGSUP(636)        ! if in vau, dead.
  366.       IF(ZGNOMF.OR.(HERE.NE.BKTWI)) RETURN      ! if not in twi, nothing.
  367.       ZGNOMF=.TRUE.                             ! gnome only comes once
  368.       CFLAG(CEVZGI)=.TRUE.                      ! turn on gnome timer
  369.       CTICK(CEVZGI)=5
  370.       RETURN
  371. C
  372. C CEV18--       Gnome of Zurich entrance.
  373. C
  374. 18000 IF(HERE.NE.BKTWI) RETURN                  ! player here?
  375.       CFLAG(CEVZGO)=.TRUE.                      ! exits, too.
  376.       CTICK(CEVZGO)=12
  377.       CALL NEWSTA(ZGNOM,637,BKTWI,0,0)          ! place in twi.
  378.       RETURN
  379. C
  380. C CEV19--       Gnome of Zurich exits.
  381. C
  382. 19000 CALL NEWSTA(ZGNOM,0,0,0,0)                ! vanish.
  383.       IF(HERE.EQ.BKTWI) CALL RSPEAK(638)        ! announce.
  384.       RETURN
  385.  
  386. C CEVAPP, PAGE 8
  387. C
  388. C CEV20--       Start of endgame.
  389. C
  390. 20000 IF(SPELLF) GO TO 20200                    ! spell his way in?
  391.       IF(HERE.NE.CRYPT) RETURN                  ! no, still in tomb?
  392.       IF(.NOT.LIT(HERE)) GO TO 20100            ! lights off?
  393.       CFLAG(CEVSTE)=.TRUE.
  394.       CTICK(CEVSTE)=3                           ! reschedule.
  395.       RETURN
  396. C
  397. 20100 CALL RSPEAK(727)                          ! announce.
  398. 20200 DO 20300 I=1,OLNT                         ! strip him of objs.
  399.         CALL NEWSTA(I,0,OROOM(I),OCAN(I),0)
  400. 20300 CONTINUE
  401.       CALL NEWSTA(LAMP,0,0,0,PLAYER)            ! give him lamp.
  402.       CALL NEWSTA(SWORD,0,0,0,PLAYER)           ! give him sword.
  403. C
  404.       OFLAG1(LAMP)=(OFLAG1(LAMP).OR.LITEBT).AND. .NOT.ONBT
  405.       OFLAG2(LAMP)=OFLAG2(LAMP).OR.TCHBT
  406.       CFLAG(CEVLNT)=.FALSE.                     ! lamp is good as new.
  407.       CTICK(CEVLNT)=350
  408.       ORLAMP=0
  409.       OFLAG2(SWORD)=OFLAG2(SWORD).OR.TCHBT      ! recreate sword.
  410.       SWDACT=.TRUE.
  411.       SWDSTA=0
  412. C
  413.       THFACT=.FALSE.                            ! thief gone.
  414.       ENDGMF=.TRUE.                             ! endgame running.
  415.       CFLAG(CEVEGH)=.FALSE.                     ! herald gone,
  416.       CFLAG(CEVMAT)=.FALSE.                     ! matches gone,
  417.       CFLAG(CEVCND)=.FALSE.                     ! candles gone.
  418. C
  419.       CALL SCRUPD(RVAL(CRYPT))                  ! score crypt,
  420.       RVAL(CRYPT)=0                             ! but only once.
  421.       F=MOVETO(TSTRS,WINNER)                    ! to top of stairs,
  422.       F=RMDESC(3)                               ! and describe.
  423.       RETURN                                    ! bam!
  424. C
  425. C CEV21--       Mirror closes.
  426. C
  427. 21000 MRPSHF=.FALSE.                            ! button is out.
  428.       MROPNF=.FALSE.                            ! mirror is closed.
  429.       IF(HERE.EQ.MRANT) CALL RSPEAK(728)        ! describe button.
  430.       IF((HERE.EQ.INMIR).OR.(MRHERE(HERE).EQ.1))
  431.      1CALL RSPEAK(729)                          ! describe mirror.
  432.       RETURN
  433.  
  434. C CEVAPP, PAGE 9
  435. C
  436. C CEV22--       Door closes.
  437. C
  438. 22000 IF(WDOPNF) CALL RSPEAK(730)               ! describe.
  439.       WDOPNF=.FALSE.                            ! closed.
  440.       RETURN
  441. C
  442. C CEV23--       Inquisitor's question.
  443. C
  444. 23000 IF(AROOM(PLAYER).NE.FDOOR) RETURN         ! if player left, die.
  445.       CALL RSPEAK(769)
  446.       CALL RSPEAK(770+QUESNO)
  447.       CFLAG(CEVINQ)=.TRUE.
  448.       CTICK(CEVINQ)=2
  449.       RETURN
  450. C
  451. C CEV24--       Master follows.
  452. C
  453. 24000 IF(AROOM(AMASTR).EQ.HERE) RETURN          ! no movement, done.
  454.       IF((HERE.NE.CELL).AND.(HERE.NE.PCELL)) GO TO 24100
  455.       IF(FOLLWF) CALL RSPEAK(811)               ! wont go to cells.
  456.       FOLLWF=.FALSE.
  457.       RETURN
  458. C
  459. 24100 FOLLWF=.TRUE.                             ! following.
  460.       I=812                                     ! assume catches up.
  461.       DO 24200 J=XMIN,XMAX,XMIN
  462.         IF(FINDXT(J,AROOM(AMASTR)).AND.(XROOM1.EQ.HERE))
  463.      1I=813                                     ! assume follows.
  464. 24200 CONTINUE
  465.       CALL RSPEAK(I)
  466.       CALL NEWSTA(MASTER,0,HERE,0,0)            ! move master object.
  467.       AROOM(AMASTR)=HERE                        ! move master actor.
  468.       RETURN
  469. C
  470. C CEV25--       Brochure arrives.
  471. C
  472. 25000 CALL NEWSTA(BROCH,948,0,MAILB,0)          ! put brochure in mailbox
  473.       BROC2F=.TRUE.                             ! flag arrival
  474.       RETURN
  475.  
  476. C CEVAPP, PAGE 10
  477. C
  478. C CEV26--       Cyclops.
  479. C
  480. 26000 IF(HERE.NE.MCYCL.OR.MAGICF) GO TO 26500   ! player or cyclops gone?
  481.       IF(CYCLOF) RETURN                         ! if asleep, check later
  482.       IF(IABS(RVCYC).LE.5) GO TO 26200          ! cyclops overly annoyed?
  483.       CFLAG(CEVCYC)=.FALSE.                     ! disable cyclops timer
  484.       CALL JIGSUP(188)                          ! player munched for lunch
  485.       RETURN
  486. C
  487. 26200 IF(RVCYC.LT.0) RVCYC=RVCYC-1              ! cyclops gets more annoyed
  488.       IF(RVCYC.GE.0) RVCYC=RVCYC+1
  489.       CALL RSPEAK(193+IABS(RVCYC))              ! report cyclops state
  490.       RETURN
  491. C
  492. 26500 CFLAG(CEVCYC)=.FALSE.                     ! disable cyclops timer
  493.       RETURN
  494. C
  495. C CEV27--       Slippery slide.
  496. C
  497. 27000 IF((HERE.LT.SLID1).OR.(HERE.GE.SLEDG)) RETURN ! in slide?
  498.       CALL RSPEAK(1034)                         ! slide to cellar
  499.       F=MOVETO(CELLA,WINNER)                    ! into cellar
  500.       F=RMDESC(3)                               ! describe
  501.       RETURN
  502. C
  503. C CEV28--       Exorcism bell.
  504. C
  505. 28000 IF(.NOT.EXORCF.AND.(HERE.EQ.LLD1)) CALL RSPEAK(970)
  506.       EXORBF=.FALSE.                            ! spell broken
  507.       RETURN
  508. C
  509. C CEV29--       Exorcism candles.
  510. C
  511. 29000 EXORCF=.FALSE.                            ! spell broken
  512.       GO TO 28000
  513. C
  514. C CEV30--       Hot bell cools down.
  515. C
  516. 30000 CALL NEWSTA(HBELL,0,0,0,0)                ! banish hot bell
  517.       CALL NEWSTA(BELL,0,LLD1,0,0)              ! get normal bell
  518.       IF(LASTIT.EQ.HBELL) LASTIT=BELL           ! fix last it reference.
  519.       IF(HERE.EQ.LLD1) CALL RSPEAK(971)         ! tell player if here
  520.       RETURN
  521. C
  522.       END
  523.  
  524. C LITINT-       Light interrupt processor
  525. C
  526. C Declarations
  527. C
  528.       SUBROUTINE LITINT(OBJ,CTR,CEV,TICKS,TICKLN)
  529.       IMPLICIT INTEGER (A-Z)
  530.       INCLUDE 'dparam.for'
  531.       INTEGER TICKS(TICKLN)
  532. C
  533.       CTR=CTR+1                                 ! advance state cntr.
  534.       CTICK(CEV)=TICKS(CTR)                     ! reset interrupt.
  535.       IF(CTICK(CEV).NE.0) GO TO 100             ! expired?
  536.       OFLAG1(OBJ)=OFLAG1(OBJ).AND. .NOT.(LITEBT+FLAMBT+ONBT)
  537.       IF((OROOM(OBJ).EQ.HERE).OR.(OADV(OBJ).EQ.WINNER))
  538.      1CALL RSPSUB(293,ODESC2(OBJ))
  539.       RETURN
  540. C
  541. 100   CFLAG(CEV)=.TRUE.
  542.       IF((OROOM(OBJ).EQ.HERE).OR.(OADV(OBJ).EQ.WINNER))
  543.      1CALL RSPEAK(TICKS(CTR+(TICKLN/2)))
  544.       RETURN
  545. C
  546.       END
  547.  
  548. C FIGHTD- Intermove fight demon
  549. C
  550. C Declarations
  551. C
  552.       SUBROUTINE FIGHTD
  553.       IMPLICIT INTEGER (A-Z)
  554.       INCLUDE 'dparam.for'
  555.       LOGICAL PROB,OAPPLI,F
  556. C
  557. C Functions and data
  558. C
  559.       DATA ROUT/1/
  560.  
  561. C FIGHTD, PAGE 2
  562. C
  563.       DO 2400 I=1,VLNT                          ! loop thru villains.
  564.         VOPPS(I)=0                              ! clear opponent slot.
  565.         OBJ=VILLNS(I)                           ! get object no.
  566.         RA=OACTIO(OBJ)                          ! get his action.
  567.         IF(HERE.NE.OROOM(OBJ)) GO TO 2200       ! adventurer still here?
  568.         IF((OBJ.NE.THIEF).OR. .NOT.THFENF) GO TO 2010 ! thief engrossed?
  569.         THFENF=.FALSE.                          ! yes, not anymore.
  570.         GO TO 2400
  571. C
  572. 2010    IF(OCAPAC(OBJ).GE.0) GO TO 2050         ! no, vill awake?
  573.         IF((VPROB(I).EQ.0).OR..NOT.PROB(VPROB(I),(100+VPROB(I))/2))
  574.      1GO TO 2025                                ! no, see if wakes up.
  575.         OCAPAC(OBJ)=IABS(OCAPAC(OBJ))
  576.         VPROB(I)=0
  577.         IF(RA.EQ.0) GO TO 2400                  ! anything to do?
  578.         PRSA=INXW                               ! yes, wake him up.
  579.         F=OAPPLI(RA,0)
  580.         GO TO 2400                              ! nothing else happens.
  581. C
  582. 2025    VPROB(I)=VPROB(I)+10                    ! increase wakeup prob.
  583.         GO TO 2400                              ! nothing else.
  584. C
  585. 2050    IF((OFLAG2(OBJ).AND.FITEBT).EQ.0) GO TO 2100
  586.         VOPPS(I)=OBJ                            ! fighting, set up opp.
  587.         GO TO 2400
  588. C
  589. 2100    IF(RA.EQ.0) GO TO 2400                  ! not fighting,
  590.         PRSA=FRSTQW                             ! set up probability
  591.         IF(.NOT.OAPPLI(RA,0)) GO TO 2400        ! of fighting.
  592.         OFLAG2(OBJ)=OFLAG2(OBJ).OR.FITEBT
  593.         VOPPS(I)=OBJ                            ! set up opp.
  594.         PRSCON=0                                ! stop cmd stream.
  595.         GO TO 2400
  596. C
  597. 2200    IF(((OFLAG2(OBJ).AND.FITEBT).EQ.0).OR.(RA.EQ.0))
  598.      1GO TO 2300                                ! nothing to do.
  599.         PRSA=FIGHTW                             ! have a fight.
  600.         F=OAPPLI(RA,0)
  601. 2300    IF(OBJ.EQ.THIEF) THFENF=.FALSE.         ! turn off engrossed.
  602.         AFLAG(PLAYER)=AFLAG(PLAYER).AND. .NOT.ASTAG
  603.         OFLAG2(OBJ)=OFLAG2(OBJ).AND. .NOT.(STAGBT+FITEBT)
  604.         IF((OCAPAC(OBJ).GE.0).OR.(RA.EQ.0))
  605.      1GO TO 2400
  606.         PRSA=INXW                               ! wake him up.
  607.         F=OAPPLI(RA,0)
  608.         OCAPAC(OBJ)=IABS(OCAPAC(OBJ))
  609. 2400  CONTINUE
  610.  
  611. C FIGHTD, PAGE 3
  612. C
  613. C Now do actual counterblows.
  614. C
  615.       OUT=0                                     ! assume hero ok.
  616. 2600  DO 2700 I=1,VLNT                          ! loop thru opps.
  617.         J=VOPPS(I)
  618.         IF(J.EQ.0) GO TO 2700                   ! slot empty?
  619.         PRSCON=0                                ! stop cmd stream.
  620.         RA=OACTIO(J)
  621.         IF(RA.EQ.0) GO TO 2650                  ! villain action?
  622.         PRSA=FIGHTW                             ! see if
  623.         IF(OAPPLI(RA,0)) GO TO 2700             ! special action.
  624. 2650    RES=BLOW(PLAYER,J,VMELEE(I),.FALSE.,OUT) ! strike blow.
  625.         IF(RES.LT.0) RETURN                     ! if hero dead, exit.
  626.         IF(RES.EQ.ROUT) OUT=2+RND(3)            ! if hero out, set flg.
  627. 2700  CONTINUE
  628.       OUT=OUT-1                                 ! decrement out count.
  629.       IF(OUT.GT.0) GO TO 2600                   ! if still out, go again.
  630.       RETURN
  631. C
  632.       END
  633.  
  634. C BLOW- Strike blow
  635. C
  636. C Declarations
  637. C
  638.       INTEGER FUNCTION BLOW(H,V,RMK,HFLG,OUT)
  639.       IMPLICIT INTEGER (A-Z)
  640.       INCLUDE 'dparam.for'
  641.       LOGICAL HFLG,OAPPLI,PROB,F
  642.       INTEGER DEF1R(3),DEF2R(4),DEF3R(5)
  643.       INTEGER RVECTR(66),RSTATE(45)
  644. C
  645. C Functions and data
  646. C
  647.       DATA RMISS/0/,ROUT/1/,RKILL/2/,RXXX/3/
  648.       DATA RSER/4/,RSTAG/5/,RLOSE/6/,RHES/7/,RSIT/8/
  649.       DATA DEF1R/1,2,3/
  650.       DATA DEF2R/13,23,24,25/
  651.       DATA DEF3R/35,36,46,47,57/
  652. C
  653.       DATA RVECTR/0,0,0,0,5,5,1,1,2,2,2,2,
  654.      10,0,0,0,0,5,5,3,3,1,
  655.      20,0,0,5,5,3,3,3,1,2,2,2,
  656.      30,0,0,0,0,5,5,3,3,4,4,
  657.      40,0,0,5,5,3,3,3,4,4,4,
  658.      50,5,5,3,3,3,3,4,4,4/
  659.       DATA RSTATE/5000,3005,3008,4011,3015,3018,1021,0,0,
  660.      15022,3027,3030,4033,3037,3040,1043,0,0,
  661.      24044,2048,4050,4054,5058,4063,4067,3071,1074,
  662.      34075,1079,4080,4084,4088,4092,4096,4100,1104,
  663.      44105,2109,4111,4115,4119,4123,4127,3131,3134/
  664.  
  665. C BLOW, PAGE 2
  666. C
  667.       RA=OACTIO(V)                              ! get villain action,
  668.       DV=ODESC2(V)                              ! description.
  669.       BLOW=RMISS                                ! assume no result.
  670. D     PRINT 10,H,V,RMK,HFLG,OUT
  671. D10   FORMAT(' BLOW 10-- ',3I7,L7,I7)
  672.       IF(.NOT.HFLG) GO TO 1000                  ! hero striking blow?
  673. C
  674. C Hero is attacker, villain is defender.
  675. C
  676.       PBLOSE=10                                 ! bad lk prob.
  677.       OFLAG2(V)=OFLAG2(V).OR.FITEBT             ! yes, villain gets mad.
  678.       IF((AFLAG(H).AND.ASTAG).EQ.0) GO TO 100   ! hero stag?
  679.       CALL RSPEAK(591)                          ! yes, cant fight.
  680.       AFLAG(H)=AFLAG(H).AND. .NOT.ASTAG
  681.       RETURN
  682. C
  683. 100   ATT=MAX0(1,FIGHTS(H,.TRUE.))              ! get his strength.
  684.       OA=ATT
  685.       DEF=VILSTR(V)                             ! get vill strength.
  686.       OD=DEF
  687.       DWEAP=0                                   ! assume no weapon.
  688.       DO 200 I=1,OLNT                           ! search villain.
  689.         IF((OCAN(I).EQ.V).AND.((OFLAG2(I).AND.WEAPBT).NE.0))
  690.      1DWEAP=I
  691. 200   CONTINUE
  692.       IF(V.EQ.AOBJ(PLAYER)) GO TO 300           ! killing self?
  693.       IF(DEF.NE.0) GO TO 2000                   ! defender alive?
  694.       CALL RSPSUB(592,DV)                       ! villain dead.
  695.       RETURN
  696. C
  697. 300   CALL JIGSUP(593)                          ! killing self.
  698.       RETURN
  699. C
  700. C Villain is attacker, hero is defender.
  701. C
  702. 1000  PRSCON=0                                  ! stop cmd stream.
  703.       PBLOSE=50                                 ! bad lk prob.
  704.       AFLAG(H)=AFLAG(H).AND..NOT.ASTAG          ! vill striking.
  705.       IF((OFLAG2(V).AND.STAGBT).EQ.0) GO TO 1200 ! vill staggered?
  706.       OFLAG2(V)=OFLAG2(V).AND. .NOT.STAGBT      ! make him ok.
  707.       CALL RSPSUB(594,DV)                       ! describe.
  708.       RETURN
  709. C
  710. 1200  ATT=VILSTR(V)                             ! set up att, def.
  711.       OA=ATT
  712.       DEF=FIGHTS(H,.TRUE.)
  713.       IF(DEF.LE.0) RETURN                       ! dont allow dead def.
  714.       OD=FIGHTS(H,.FALSE.)
  715.       DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.))   ! find a weapon.
  716.  
  717. C BLOW, PAGE 3
  718. C
  719. C Parties are now equipped.  DEF cannot be zero.
  720. C ATT must be > 0.
  721. C
  722. 2000  CONTINUE
  723. D     PRINT 2050,ATT,OA,DEF,OD,DWEAP
  724. D2050 FORMAT(' BLOW 2050-- ',5I7)
  725.       IF(DEF.GT.0) GO TO 2100                   ! def alive?
  726.       RES=RKILL
  727.       IF(HFLG) CALL RSPSUB(595,DV)              ! deader.
  728.       GO TO 3000
  729. C
  730. 2100  IF(DEF-2) 2200,2300,2400                  ! def <2,=2,>2
  731. 2200  ATT=MIN0(ATT,3)                           ! scale att.
  732.       TBL=DEF1R(ATT)                            ! choose table.
  733.       GO TO 2500
  734. C
  735. 2300  ATT=MIN0(ATT,4)                           ! scale att.
  736.       TBL=DEF2R(ATT)                            ! choose table.
  737.       GO TO 2500
  738. C
  739. 2400  ATT=ATT-DEF                               ! scale att.
  740.       ATT=MIN0(2,MAX0(-2,ATT))+3
  741.       TBL=DEF3R(ATT)
  742. C
  743. 2500  RES=RVECTR(TBL+RND(10))                   ! get result.
  744.       IF(OUT.EQ.0) GO TO 2600                   ! was he out?
  745.       IF(RES.EQ.RSTAG) GO TO 2550               ! yes, stag--> hes.
  746.       RES=RSIT                                  ! otherwise, sitting.
  747.       GO TO 2600
  748. 2550  RES=RHES
  749. 2600  IF((RES.EQ.RSTAG).AND.(DWEAP.NE.0).AND.PROB(25,PBLOSE))
  750.      1RES=RLOSE                                 ! lose weapon.
  751. C
  752.       MI=RSTATE(((RMK-1)*9)+RES+1)              ! choose table entry.
  753.       IF(MI.EQ.0) GO TO 3000
  754.       I=(MOD(MI,1000)+RND(MI/1000))+MBASE+1
  755.       J=DV
  756.       IF(.NOT.HFLG .AND.(DWEAP.NE.0)) J=ODESC2(DWEAP)
  757. D     PRINT 2650,RES,MI,I,J,MBASE
  758. D2650 FORMAT(' BLOW 2650-- ',5I7)
  759.       CALL RSPSUB(I,J)                          ! present result.
  760.  
  761. C BLOW, PAGE 4
  762. C
  763. C Now apply result.
  764. C
  765. 3000  GO TO (4000,3100,3200,3300,3400,3500,3600,4000,3200),RES+1
  766. C              miss, out,kill,lght,svre,stag,lose, hes, sit
  767. C
  768. 3100  IF(HFLG) DEF=-DEF                         ! unconscious.
  769.       GO TO 4000
  770. C
  771. 3200  DEF=0                                     ! killed or sitting duck.
  772.       GO TO 4000
  773. C
  774. 3300  DEF=MAX0(0,DEF-1)                         ! light wound.
  775.       GO TO 4000
  776. C
  777. 3400  DEF=MAX0(0,DEF-2)                         ! serious wound.
  778.       GO TO 4000
  779. C
  780. 3500  IF(HFLG) GO TO 3550                       ! staggered.
  781.       AFLAG(H)=AFLAG(H).OR.ASTAG
  782.       GO TO 4000
  783. C
  784. 3550  OFLAG2(V)=OFLAG2(V).OR.STAGBT
  785.       GO TO 4000
  786. C
  787. 3600  CALL NEWSTA(DWEAP,0,HERE,0,0)             ! lose weapon.
  788.       DWEAP=0
  789.       IF(HFLG) GO TO 4000                       ! if hero, done.
  790.       DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.))   ! get new.
  791.       IF(DWEAP.NE.0) CALL RSPSUB(605,ODESC2(DWEAP))
  792.  
  793. C BLOW, PAGE 5
  794. C
  795. 4000  BLOW=RES                                  ! return result.
  796.       IF(.NOT.HFLG) GO TO 4500                  ! hero?
  797.       OCAPAC(V)=DEF                             ! store new capacity.
  798.       IF(DEF.NE.0) GO TO 4100                   ! dead?
  799.       OFLAG2(V)=OFLAG2(V).AND. .NOT.FITEBT      ! yes, not fighting.
  800.       CALL RSPSUB(572,DV)                       ! he dies.
  801.       CALL NEWSTA(V,0,0,0,0)                    ! make him disappear.
  802.       IF(RA.EQ.0) RETURN                        ! if nx to do, exit.
  803.       PRSA=DEADXW                               ! let him know.
  804.       F=OAPPLI(RA,0)
  805.       RETURN
  806. C
  807. 4100  IF((RES.NE.ROUT).OR.(RA.EQ.0)) RETURN
  808.       PRSA=OUTXW                                ! let him be out.
  809.       F=OAPPLI(RA,0)
  810.       RETURN
  811. C
  812. 4500  ASTREN(H)=-10000                          ! assume dead.
  813.       IF(DEF.NE.0) ASTREN(H)=DEF-OD
  814.       IF(DEF.GE.OD) GO TO 4600
  815.       CTICK(CEVCUR)=30
  816.       CFLAG(CEVCUR)=.TRUE.
  817. 4600  IF(FIGHTS(H,.TRUE.).GT.0) RETURN
  818.       ASTREN(H)=1-FIGHTS(H,.FALSE.)             ! he's dead.
  819.       CALL JIGSUP(596)
  820.       BLOW=-1
  821.       RETURN
  822. C
  823.       END
  824.  
  825. C SWORDD- Intermove sword demon
  826. C
  827. C Declarations
  828. C
  829.       SUBROUTINE SWORDD
  830.       IMPLICIT INTEGER (A-Z)
  831.       INCLUDE 'dparam.for'
  832.       LOGICAL INFEST,FINDXT
  833. C
  834.       IF(OADV(SWORD).NE.PLAYER) GO TO 500       ! holding sword?
  835.       NG=2                                      ! assume vill close.
  836.       IF(INFEST(HERE)) GO TO 300                ! vill here?
  837.       NG=1
  838.       DO 200 I=XMIN,XMAX,XMIN                   ! no, search rooms.
  839.         IF(.NOT.FINDXT(I,HERE)) GO TO 200       ! room that way?
  840.         GO TO (50,200,50,50),XTYPE              ! see if room at all.
  841. 50      IF(INFEST(XROOM1)) GO TO 300            ! check room.
  842. 200   CONTINUE
  843.       NG=0                                      ! no glow.
  844. C
  845. 300   IF(NG.EQ.SWDSTA) RETURN                   ! any state change?
  846.       CALL RSPEAK(NG+495)                       ! yes, tell new state.
  847.       SWDSTA=NG
  848.       RETURN
  849. C
  850. 500   SWDACT=.FALSE.                            ! dropped sword,
  851.       RETURN                                    ! disable demon.
  852.       END
  853.  
  854. C INFEST-       Subroutine to test for infested room
  855. C
  856. C Declarations
  857. C
  858.       LOGICAL FUNCTION INFEST(R)
  859.       IMPLICIT INTEGER (A-Z)
  860.       INCLUDE 'dparam.for'
  861. C
  862.       IF(.NOT.ENDGMF) INFEST=(OROOM(CYCLO).EQ.R).OR.
  863.      1(OROOM(TROLL).EQ.R).OR.
  864.      2((OROOM(THIEF).EQ.R).AND.THFACT)
  865.       IF(ENDGMF) INFEST=(R.EQ.MRG).OR.(R.EQ.MRGE).OR.
  866.      1(R.EQ.MRGW).OR.
  867.      2((R.EQ.INMIR).AND.(MLOC.EQ.MRG))
  868.       RETURN
  869.       END
  870.  
  871. C AAPPLI- Applicables for adventurers
  872. C
  873. C Declarations
  874. C
  875.       LOGICAL FUNCTION AAPPLI(RI)
  876.       IMPLICIT INTEGER (A-Z)
  877.       INCLUDE 'dparam.for'
  878.       LOGICAL F,MOVETO,QHERE,FINDXT
  879. C
  880.       IF(RI.EQ.0) GO TO 10                      ! if zero, no app.
  881.       AAPPLI=.TRUE.                             ! assume wins.
  882.       GO TO (1000,2000,3000),RI                 ! branch on adv.
  883.       CALL BUG(11,RI)
  884. C
  885. C Common false return.
  886. C
  887. 10    AAPPLI=.FALSE.
  888.       RETURN
  889.  
  890. C AAPPLI, PAGE 2
  891. C
  892. C A1--  Dead player.
  893. C
  894. 1000  IF((PRSA.NE.ATTACW).AND.(PRSA.NE.MUNGW).AND.
  895.      1 (PRSA.NE.KILLW).AND.(PRSA.NE.SWINGW).AND.
  896.      2 (PRSA.NE.KICKW).AND.(PRSA.NE.BLASTW)) GO TO 1050
  897.       CALL RSPEAK(949)                          ! dead can't attack.
  898.       RETURN
  899. C
  900. 1050  IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW).AND.
  901.      1 (PRSA.NE.EATW).AND.(PRSA.NE.DRINKW).AND.
  902.      2 (PRSA.NE.INFLAW).AND.(PRSA.NE.DEFLAW).AND.
  903.      3 (PRSA.NE.TURNW).AND.(PRSA.NE.TIEW).AND.
  904.      4 (PRSA.NE.RUBW).AND.(PRSA.NE.COUNTW).AND.
  905.      5 (PRSA.NE.BURNW).AND.(PRSA.NE.UNTIEW)) GO TO 1100
  906.       CALL RSPEAK(950)                          ! dead can't do simple acts.
  907.       RETURN
  908. C
  909. 1100  IF(PRSA.NE.TRNONW) GO TO 1150
  910.       CALL RSPEAK(951)                          ! dead don't need lights.
  911.       RETURN
  912. C
  913. 1150  IF(PRSA.NE.SCOREW) GO TO 1200
  914.       CALL RSPEAK(952)                          ! dead can't score.
  915.       RETURN
  916. C
  917. 1200  IF(PRSA.NE.TELLW) GO TO 1250
  918.       CALL RSPEAK(953)                          ! dead can't give orders.
  919.       RETURN
  920. C
  921. 1250  IF(PRSA.NE.TAKEW) GO TO 1300
  922.       CALL RSPEAK(954)                          ! dead can't take.
  923.       RETURN
  924. C
  925. 1300  IF((PRSA.NE.DROPW).AND.(PRSA.NE.THROWW).AND.
  926.      1 (PRSA.NE.INVENW)) GO TO 1350
  927.       CALL RSPEAK(955)                          ! dead have no possesions
  928.       RETURN
  929. C
  930. 1350  IF(PRSA.NE.DIAGNW) GO TO 1400
  931.       CALL RSPEAK(956)                          ! dead as a doornail
  932.       RETURN
  933. C
  934. 1400  IF(PRSA.NE.LOOKW) GO TO 1500
  935.       I=957                                     ! assume nothing here
  936.       DO 1450 J=1,OLNT                          ! loop through objects
  937.         IF(QHERE(J,HERE)) I=958                 ! found something
  938. 1450  CONTINUE
  939.       CALL RSPEAK(I)                            ! describe objects
  940.       IF((RFLAG(HERE).AND.RLIGHT).EQ.0) CALL RSPEAK(959)
  941.       GO TO 10                                  ! don't handle
  942. C
  943. 1500  IF(PRSA.NE.PRAYW) GO TO 1600
  944.       IF(HERE.EQ.TEMP2) GO TO 1550              ! praying in temple?
  945.       CALL RSPEAK(960)                          ! prayers are not answered
  946.       RETURN
  947. C
  948. 1550  OFLAG1(LAMP)=OFLAG1(LAMP).OR.VISIBT       ! back to life, restore lamp
  949.       AACTIO(PLAYER)=0                          ! disable dead player
  950.       DEADF=.FALSE.                             ! clear dead flag
  951.       F=MOVETO(FORE1,WINNER)                    ! move to forest
  952.       CALL RSPEAK(9)                            ! describe
  953.       RETURN
  954. C
  955. 1600  IF(PRSA.NE.WALKW) GO TO 1700
  956.       IF(.NOT.FINDXT(PRSO,HERE)) GO TO 10       ! if no exits, don't handle
  957.       IF(XROOM1.NE.BSHAF) GO TO 10              ! if not bshaft, don't handle
  958.       CALL RSPEAK(962)                          ! can't go and score points
  959.       RETURN
  960. C
  961. 1700  IF(PRSA.EQ.QUITW) GO TO 10                ! if quit, don't handle
  962.       CALL RSPEAK(963)                          ! can't do it
  963.       RETURN
  964.  
  965. C
  966. C A2--  Robot.  Process most commands given to robot.
  967. C
  968. 2000  IF((PRSA.NE.RAISEW).OR.(PRSO.NE.RCAGE)) GO TO 2200
  969.       CFLAG(CEVSPH)=.FALSE.                     ! robot raised cage.
  970.       WINNER=PLAYER                             ! reset for player.
  971.       F=MOVETO(CAGER,WINNER)                    ! move to new room.
  972.       CALL NEWSTA(CAGE,567,CAGER,0,0)           ! install cage in room.
  973.       CALL NEWSTA(ROBOT,0,CAGER,0,0)            ! install robot in room.
  974.       AROOM(AROBOT)=CAGER                       ! also move robot/adv.
  975.       CAGESF=.TRUE.                             ! cage solved.
  976.       OFLAG1(ROBOT)=OFLAG1(ROBOT).AND..NOT.NDSCBT
  977.       OFLAG1(SPHER)=OFLAG1(SPHER).OR.TAKEBT     ! reset flags.
  978.       PRSCON=0                                  ! stop cmd stream.
  979.       RETURN
  980. C
  981. 2200  IF((PRSA.NE.DRINKW).AND.(PRSA.NE.EATW)) GO TO 2300
  982.       CALL RSPEAK(568)                          ! eat or drink, joke.
  983.       RETURN
  984. C
  985. 2300  IF(PRSA.NE.READW) GO TO 2400              ! read,
  986.       CALL RSPEAK(569)                          ! joke.
  987.       RETURN
  988. C
  989. 2400  IF((PRSA.EQ.WALKW).OR.(PRSA.EQ.TAKEW).OR.(PRSA.EQ.DROPW)
  990.      1.OR.(PRSA.EQ.PUTW).OR.(PRSA.EQ.PUSHW).OR.(PRSA.EQ.LEAPW)
  991.      2.OR.(PRSA.EQ.TURNW)) GO TO 2500           ! test for robot verb.
  992.       CALL RSPEAK(570)                          ! joke.
  993.       RETURN
  994. C
  995. 2500  CALL RSPEAK(930)                          ! buzz, whirr, click!
  996.       GO TO 10                                  ! don't handle here.
  997.  
  998. C AAPPLI, PAGE 3
  999. C
  1000. C A3--  Master.  Process most commands given to master.
  1001. C
  1002. 3000  IF((OFLAG2(QDOOR).AND.OPENBT).NE.0) GO TO 3100
  1003.       CALL RSPEAK(783)                          ! no master yet.
  1004.       RETURN
  1005. C
  1006. 3100  IF(PRSA.NE.WALKW) GO TO 3200              ! walk?
  1007.       I=784                                     ! assume wont.
  1008.       IF(((HERE.EQ.SCORR).AND.
  1009.      1((PRSO.EQ.XNORTH).OR.(PRSO.EQ.XENTER))).OR.
  1010.      2 ((HERE.EQ.NCORR).AND.
  1011.      3((PRSO.EQ.XSOUTH).OR.(PRSO.EQ.XENTER))))
  1012.      4I=785                                     ! if prison, cant.
  1013.       CALL RSPEAK(I)
  1014.       RETURN
  1015. C
  1016. 3200  IF((PRSA.EQ.STAYW).OR.(PRSA.EQ.FOLLOW).OR.(PRSA.EQ.KILLW).OR.
  1017.      1 (PRSA.EQ.MUNGW).OR.(PRSA.EQ.ATTACW)) GO TO 10
  1018.       IF((PRSA.EQ.TAKEW).OR.(PRSA.EQ.DROPW).OR.(PRSA.EQ.PUTW).OR.
  1019.      1 (PRSA.EQ.THROWW).OR.(PRSA.EQ.PUSHW).OR.(PRSA.EQ.TURNW).OR.
  1020.      2 (PRSA.EQ.SPINW).OR.(PRSA.EQ.TRNTOW).OR.(PRSA.EQ.OPENW).OR.
  1021.      3 (PRSA.EQ.CLOSEW)) GO TO 3300             ! master can, politely.
  1022.       CALL RSPEAK(786)                          ! master can't.
  1023.       RETURN
  1024. C
  1025. 3300  CALL RSPEAK(1057)                         ! polite reply.
  1026.       GO TO 10
  1027. C
  1028.       END
  1029.  
  1030. C THIEFD-       Intermove thief demon
  1031. C
  1032. C Declarations
  1033. C
  1034. C This routine details on bit 6 of PRSFLG
  1035. C
  1036.       SUBROUTINE THIEFD
  1037.       IMPLICIT INTEGER (A-Z)
  1038.       INCLUDE 'dparam.for'
  1039.       LOGICAL DFLAG,ONCE,PROB,QHERE,QSTILL,LIT,WINNIN,WASLIT
  1040. C
  1041. C Functions AND DATA
  1042. C
  1043.       QSTILL(R)=(QHERE(STILL,R).OR.(OADV(STILL).EQ.-THIEF))
  1044.  
  1045. C THIEFD, PAGE 2
  1046. C
  1047.       DFLAG=(PRSFLG.AND.64).NE.0                ! set up detail flag.
  1048.       ONCE=.FALSE.                              ! init flag.
  1049. 1025  WASLIT=LIT(HERE)                          ! record if lit.
  1050.       RHERE=OROOM(THIEF)                        ! visible pos.
  1051.       IF(RHERE.NE.0) THFPOS=RHERE
  1052. C
  1053.       IF((THFPOS.EQ.HERE).AND..NOT.DEADF) GO TO 1100 ! thief in live win rm?
  1054.       IF(THFPOS.NE.TREAS) GO TO 1400            ! thief not in treas?
  1055. C
  1056. C Thief is in treasure room, and winner is not.
  1057. C
  1058.       IF(DFLAG) PRINT 10
  1059. 10    FORMAT(' THIEFD-- IN TREASURE ROOM')
  1060.       IF(RHERE.EQ.0) GO TO 1050                 ! visible?
  1061.       CALL NEWSTA(THIEF,0,0,0,0)                ! yes, vanish.
  1062.       RHERE=0
  1063.       IF(QSTILL(TREAS)) CALL NEWSTA(STILL,0,0,THIEF,0)
  1064.       DO 1040 I=1,OLNT                          ! loop through objects.
  1065.         IF(QHERE(I,THFPOS))
  1066.      1OFLAG1(I)=OFLAG1(I).OR.VISIBT             ! make objects visible
  1067. 1040  CONTINUE
  1068. 1050  I=ROBADV(-THIEF,THFPOS,0,0)               ! drop valuables.
  1069.       IF(QHERE(EGG,THFPOS)) OFLAG2(EGG)=OFLAG2(EGG).OR.OPENBT
  1070.       GO TO 1700
  1071.  
  1072. C THIEFD, PAGE 3
  1073. C
  1074. C Thief and (live) winner in same room.
  1075. C
  1076. 1100  IF(THFPOS.EQ.TREAS) GO TO 1700            ! if treas room, nothing.
  1077.       IF((RFLAG(THFPOS).AND.RLIGHT).NE.0) GO TO 1400 ! not if light.
  1078.       IF(DFLAG) PRINT 20
  1079. 20    FORMAT(' THIEFD-- IN ADV ROOM')
  1080.       IF(THFFLG) GO TO 1300                     ! thief announced?
  1081.       IF((RHERE.NE.0).OR.PROB(70,70))   GO TO 1150 ! if invis and 30%.
  1082.       IF(OCAN(STILL).NE.THIEF) GO TO 1700       ! abort if no stilletto.
  1083.       CALL NEWSTA(THIEF,583,THFPOS,0,0)         ! insert thief into room.
  1084.       THFFLG=.TRUE.                             ! thief is announced.
  1085.       RETURN
  1086. C
  1087. 1150  IF((RHERE.EQ.0).OR.((OFLAG2(THIEF).AND.FITEBT).EQ.0))
  1088.      1GO TO 1200                                ! if visible and fight.
  1089.       IF(WINNIN(THIEF,PLAYER)) GO TO 1175       ! winning?
  1090.       CALL NEWSTA(THIEF,584,0,0,0)              ! no, vanish thief.
  1091.       OFLAG2(THIEF)=OFLAG2(THIEF).AND. .NOT.FITEBT
  1092.       IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0)
  1093.       RETURN
  1094. C
  1095. 1175  IF(PROB(90,90)) GO TO 1700                ! 90% chance to stay.
  1096. C
  1097. 1200  IF((RHERE.EQ.0).OR.PROB(70,70)) GO TO 1250 ! if visible and 30%
  1098.       CALL NEWSTA(THIEF,585,0,0,0)              ! vanish thief.
  1099.       IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0)
  1100.       RETURN
  1101. C
  1102. 1300  IF(RHERE.EQ.0) GO TO 1700                 ! announced.  visible?
  1103. 1250  IF(PROB(70,70)) RETURN                    ! 70% chance to do nothing.
  1104.       THFFLG=.TRUE.
  1105.       NR=ROBRM(THFPOS,100,0,0,-THIEF)+ROBADV(PLAYER,0,0,-THIEF)
  1106.       I=586                                     ! robbed em.
  1107.       IF(RHERE.NE.0) I=588                      ! was he visible?
  1108.       CALL NEWSTA(THIEF,I+MIN0(1,NR),0,0,0)     ! vanish thief, give result.
  1109.       IF(QSTILL(THFPOS))
  1110.      1CALL NEWSTA(STILL,0,0,THIEF,0)            ! reclaim stilletto.
  1111.       IF(WASLIT.AND..NOT.LIT(HERE).AND.(HERE.EQ.AROOM(PLAYER)))
  1112.      1CALL RSPEAK(915)                          ! leave player in dark?
  1113.       RHERE=0
  1114.       GO TO 1700                                ! onward.
  1115.  
  1116. C THIEFD, PAGE 4
  1117. C
  1118. C Not in adventurers room, or adventurer dead, or room lit.
  1119. C
  1120. 1400  CALL NEWSTA(THIEF,0,0,0,0)                ! vanish.
  1121.       RHERE=0
  1122.       IF(DFLAG) PRINT 30,THFPOS
  1123. 30    FORMAT(' THIEFD-- IN ROOM ',I4)
  1124.       IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0)
  1125.       IF((RFLAG(THFPOS).AND.RSEEN).EQ.0) GO TO 1700 ! cant rob unseen.
  1126.       RMK=1045                                  ! first object to vanish.
  1127.       I=ROBRM(THFPOS,75,0,0,-5555)              ! rob room 75% to hyperspace.
  1128.       DO 1410 I=1,OLNT                          ! loop through objects.
  1129.         IF(OADV(I).NE.-5555) GO TO 1410         ! in hyperspace?
  1130.         CALL NEWSTA(I,0,0,0,-THIEF)             ! move to thief.
  1131.         IF((THFPOS.EQ.HERE).AND..NOT.DEADF)     ! thief's remarks.
  1132.      1CALL RSPSUB(RMK,ODESC2(I))
  1133.         RMK=1083                                ! for next object.
  1134. 1410  CONTINUE
  1135. C
  1136.       IF((THFPOS.LT.MAZE1).OR.(THFPOS.GT.MAZ15).OR.
  1137.      1(HERE.LT.MAZE1).OR.(HERE.GT.MAZ15)) GO TO 1500
  1138.       DO 1450 I=1,OLNT                          ! both in maze.
  1139.         IF(.NOT.QHERE(I,THFPOS).OR.PROB(60,60).OR.(I.EQ.WATER).OR.
  1140.      1((OFLAG1(I).AND.(VISIBT+TAKEBT)).NE.(VISIBT+TAKEBT)))
  1141.      2GO TO 1450
  1142.         IF(.NOT.DEADF) CALL RSPSUB(590,ODESC2(I)) ! thief's remarks.
  1143.         IF(PROB(40,20)) GO TO 1700
  1144.         CALL NEWSTA(I,0,0,0,-THIEF)             ! steal it.
  1145.         OFLAG2(I)=OFLAG2(I).OR.TCHBT
  1146.         GO TO 1700
  1147. 1450  CONTINUE
  1148.       GO TO 1700
  1149. C
  1150. 1500  DO 1550 I=1,OLNT                          ! not in maze.
  1151.         IF(.NOT.QHERE(I,THFPOS).OR.(OTVAL(I).NE.0).OR.
  1152.      1PROB(80,60).OR.(I.EQ.WATER).OR.
  1153.      2((OFLAG1(I).AND.(VISIBT+TAKEBT)).NE.(VISIBT+TAKEBT)))
  1154.      3GO TO 1550
  1155.         CALL NEWSTA(I,0,0,0,-THIEF)
  1156.         OFLAG2(I)=OFLAG2(I).OR.TCHBT
  1157.         IF((THFPOS.EQ.HERE).AND..NOT.DEADF)
  1158.      1CALL RSPSUB(RMK,ODESC2(I))                ! vanishes before you.
  1159.         GO TO 1700
  1160. 1550  CONTINUE
  1161.  
  1162. C THIEFD, PAGE 5
  1163. C
  1164. C Now move to new room.
  1165. C
  1166. 1700  IF(OADV(ROPE).NE.-THIEF) GO TO 1725       ! did he steal rope?
  1167.       DOMEF=.FALSE.
  1168.       TTIE=0
  1169. 1725  IF(ONCE) GO TO 1800
  1170.       ONCE=.NOT.ONCE
  1171. 1750  THFPOS=THFPOS-1                           ! next room.
  1172.       IF(THFPOS.LE.0) THFPOS=RLNT
  1173.       IF((RFLAG(THFPOS).AND.(RLAND+RSACRD+REND)).NE.RLAND)
  1174.      1GO TO 1750                                ! must be land, profane.
  1175.       THFFLG=.FALSE.                            ! not announced.
  1176.       GO TO 1025                                ! once more.
  1177. C
  1178. C All done.
  1179. C
  1180. 1800  IF(THFPOS.EQ.TREAS) RETURN                ! in treasure room?
  1181.       J=1055                                    ! no, drop junky stuff.
  1182.       IF(THFPOS.NE.HERE) J=0
  1183.       DO 1850 I=1,OLNT
  1184.         IF((OADV(I).NE.-THIEF).OR.PROB(70,30).OR.
  1185.      1(OTVAL(I).GT.0)) GO TO 1850
  1186.         CALL NEWSTA(I,J,THFPOS,0,0)
  1187.         J=0
  1188. 1850  CONTINUE
  1189.       RETURN
  1190. C
  1191.       END
  1192.